﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using itau.im.relatorios.entidade;
using EnterpriseLibraryWrapper;
using System.Data;

namespace itau.im.relatorios.dado
{
    public class RelatorioGrupoParametroDB : IRelatorioGrupoParametroDAO
    {
        public IList<GrupoParametro> ObterGruposParametros()
        {
            //Cria a GrupoParametroAtribuicao
            List<GrupoParametro> listGrupoParametroAtribuicao = new List<GrupoParametro>();

            //Declara o objeto
            IDataAccessWrapper data = null;
            DataSet ds = null;

            try
            {
                //Instancia o objeto
                data = EnterpriseLibraryFactory.GetDataAccess();

                //Executa a Procedure
                ds = data.ExecuteDataSet("DB2IM.IMSEM");

                //Verifica se o Dataset retornado está vazio
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre o Dataset
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Adiciona a GrupoParametroAtribuicao na lista
                        listGrupoParametroAtribuicao.Add(EntidadeFactory.getGrupoParametro(linha));
                    }
                }
                //Retorna a lista de GrupoParametroAtribuicao
                return listGrupoParametroAtribuicao;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //Desaloca os objetos
                listGrupoParametroAtribuicao = null;
                data.Dispose();
                data = null;
            }
            //Retorna a consulta limpa
            return new List<GrupoParametro>();
        }

        public IList<ProdutoFinanceiroAlocacao> ObterProdutoFinanceiroAlocacaoPorGrupoParametro(int codigoGrupoParametro)
        {
            IDataAccessWrapper data = null;
            IList<ProdutoFinanceiroAlocacao> listaProdutoFinanceiroAlocacao = null;
            DataSet dsProd;

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                listaProdutoFinanceiroAlocacao = new List<ProdutoFinanceiroAlocacao>();

                data.ParameterIn.Add(new ParameterInWrapper("@COD_GRUP_PARM_ATR", codigoGrupoParametro, DbType.Int32));

                //Recupera produtos alocados por grupo
                dsProd = data.ExecuteDataSet("DB2IM.IMS12");

                if (dsProd.Tables.Count > 0 && dsProd.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow itemProduto in dsProd.Tables[0].Rows)
                    {
                        ProdutoFinanceiro prodFin = EntidadeFactory.getProduto(itemProduto);

                        data.ParameterIn.Clear();
                        data.ParameterOut.Clear();

                        data.ParameterIn.Add(new ParameterInWrapper("@COD_PROD_FINN", prodFin.CodigoProdutoFinanceiro, DbType.Int32));

                        DataSet dsAloc = data.ExecuteDataSet("DB2IM.IMS61");

                        if (dsAloc.Tables.Count > 0 && dsAloc.Tables[0].Rows.Count > 0)
                        {
                            foreach (DataRow itemAloc in dsAloc.Tables[0].Rows)
                            {
                                listaProdutoFinanceiroAlocacao.Add(EntidadeFactory.getProdutoAlocacao(itemAloc));
                            }
                        }
                    }
                }

                return listaProdutoFinanceiroAlocacao;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                data.Dispose();
                data = null;
            }

            return null;
        }

        public IList<ParametroAtribuicao> ObterParametrosNaoAlocadosPorGrupoParametroVigente(int codigoGrupo)
        {
            //Declara os objetos
            List<ParametroAtribuicao> listaParametrosExogenos;
            IDataAccessWrapper data = null;
            DataSet ds;

            try
            {
                // Instância o objeto
                listaParametrosExogenos = new List<ParametroAtribuicao>();

                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                data.ParameterIn.Add(new ParameterInWrapper("@WCOD_GRUP_PARM_ATR", codigoGrupo, DbType.Int32));

                //Recupera a consulta
                ds = data.ExecuteDataSet("DB2IM.IMS22");

                //Verifica se é válido o retorno
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        listaParametrosExogenos.Add(EntidadeFactory.getParametroAtribuicao(linha));
                    }
                }
                //Retorna a consulta
                return listaParametrosExogenos;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                listaParametrosExogenos = null;
                data.Dispose();
                data = null;
                ds = null;
            }

            //Retorna a consulta vazia
            return new List<ParametroAtribuicao>();
        }

    }
}
